home *** CD-ROM | disk | FTP | other *** search
File List | 1986-10-19 | 7.1 KB | 275 lines |
- ' ****************
- ' *** MIDI.LST ***
- ' ****************
- '
- DEFWRD "a-z"
- '
- > PROCEDURE clear.midi.buffer
- ' *** clear MIDI-buffer
- LOCAL buffer$
- buffer$=INPMID$
- RETURN
- ' **********
- '
- > PROCEDURE change.midi.buffer(size%)
- ' *** change size of MIDI-buffer (default 128 bytes)
- ' *** global : MIDI.BUFFER.ADR%
- LOCAL ptr%
- ptr%=XBIOS(14,2)
- IF midi.buffer.adr%=0
- midi.buffer.adr%=LPEEK(ptr%) ! address of original buffer
- ENDIF
- ERASE buffer|()
- DIM buffer|(size%-1)
- LPOKE ptr%,VARPTR(buffer|(0)) ! start-address new buffer
- DPOKE ptr%+4,size% ! size
- DPOKE ptr%+6,0 ! buffer-head
- DPOKE ptr%+8,0 ! buffer-tail
- DPOKE ptr%+10,0 ! low mark (not used)
- DPOKE ptr%+12,size%-1 ! high mark (not used)
- RETURN
- ' ***
- > PROCEDURE restore.midi.buffer
- ' *** restore default MIDI-buffer (128 bytes)
- LOCAL adres%,m$,k
- IF midi.buffer.adr%<>0
- adres%=XBIOS(14,2)
- LPOKE adres%,midi.buffer.adr% ! start-address default buffer
- DPOKE adres%+4,128 ! size
- DPOKE adres%+6,0 ! buffer-head
- DPOKE adres%+8,0 ! buffer-tail
- DPOKE adres%+10,0 ! low mark (not used)
- DPOKE adres%+12,127 ! high mark (not used)
- ELSE
- m$="default MIDI-buffer|(size 128 bytes) is|still active, so|"
- m$=m$+"Restore is superfluous"
- ALERT 3,m$,1," OK ",k
- ENDIF
- RETURN
- ' **********
- '
- > PROCEDURE all.midi.off
- ' *** switch everything off on all channels
- LOCAL channel
- FOR channel=0 TO 15
- OUT 3,&HB0+channel,123,0 ! all notes off
- OUT 3,&HB0+channel,64,0 ! sustain off
- OUT 3,&HB0+channel,1,0 ! modulation off
- OUT 3,&HE0+channel,0,0 ! pitch bend off
- NEXT channel
- RETURN
- ' **********
- '
- > PROCEDURE midi.off(channel)
- ' *** switch everything off on this channel (1-16)
- OUT 3,&HB0+channel-1,123,0 ! all notes off
- OUT 3,&HB0+channel-1,64,0 ! sustain off
- OUT 3,&HB0+channel-1,1,0 ! modulation off
- OUT 3,&HE0+channel-1,0,0 ! pitch bend off
- RETURN
- ' **********
- '
- > PROCEDURE play.midi(VAR midi.byte|(),midi.time%())
- ' *** play music (see also Procedure Record.midi)
- ' *** byte-array for notes and integer-array for time
- ' *** uses Procedure All.midi.off
- LOCAL m$,k,i%,t%,time%
- m$="record of "+STR$(INT(midi.time%(last.midi.byte%)/200))+" seconds| |"
- m$=m$+"(stop by pressing space)"
- ALERT 3,m$,1,"PLAY",k
- REPEAT
- UNTIL INKEY$=""
- i%=1
- t%=TIMER
- REPEAT
- time%=SUB(TIMER,t%)
- IF midi.time%(i%)<=time%
- OUT 3,midi.byte|(i%)
- INC i%
- ENDIF
- UNTIL i%=last.midi.byte% OR INKEY$=" "
- @all.midi.off
- RETURN
- ' **********
- '
- > PROCEDURE record.midi(VAR midi.byte|(),midi.time%())
- ' *** record music
- ' *** byte-array for notes and integer-array for time
- ' *** active sensing message ignored
- ' *** uses Procedure All.midi.off
- ' *** global : LAST.MIDI.BYTE%
- LOCAL last%,buffer$,i%,t%,time%,byte|,delay%,j%,m$,k
- ARRAYFILL midi.byte|(),0
- ARRAYFILL midi.time%(),0
- last%=DIM?(midi.byte|())-1
- m$=STR$(last%)+" bytes available ;| |stop recording|"
- m$=m$+"by pressing space"
- ALERT 3,m$,1,"RECORD",k
- REPEAT
- UNTIL INKEY$=""
- buffer$=INPMID$ ! clear MIDI-buffer
- i%=1
- t%=TIMER
- REPEAT
- IF INP?(3)
- byte|=INP(3)
- IF byte|<>254
- time%=SUB(TIMER,t%)
- midi.byte|(i%)=byte|
- midi.time%(i%)=time%
- INC i%
- ENDIF
- ENDIF
- UNTIL i%=last% OR INKEY$=" "
- last.midi.byte%=i%-1
- @all.midi.off
- delay%=midi.time%(1) ! subtract time for first note
- FOR j%=1 TO i%
- SUB midi.time%(j%),delay%
- NEXT j%
- m$="|"+STR$(i%)+" bytes recorded"
- ALERT 3,m$,1," OK ",k
- RETURN
- ' **********
- '
- > PROCEDURE midi.monitor
- ' *** simple monitor
- LOCAL m$,k,byte|,byte$,hex$,bin$,buffer$,key$
- byte$=SPACE$(3)
- hex$=SPACE$(2)
- bin$=SPACE$(8)
- m$="all incoming bytes|(except 254) are|printed on screen ;|"
- m$=m$+"stop by pressing space"
- ALERT 1,m$,1,"START",k
- m$="press|<Return>|for CLS"
- ALERT 1,m$,1," OK ",k
- REPEAT
- UNTIL INKEY$=""
- buffer$=INPMID$ ! clear MIDI-buffer
- CLS
- PRINT TAB(10);"dec";TAB(20);"hex";TAB(30);"binary"
- REPEAT
- REPEAT
- key$=INKEY$
- IF INP?(3)
- byte|=INP(3)
- IF byte|<>254
- IF TIMER-t%>200
- PRINT
- ENDIF
- t%=TIMER
- RSET byte$=STR$(byte|)
- RSET hex$=HEX$(byte|)
- RSET bin$=BIN$(byte|)
- PRINT TAB(10);byte$;TAB(20);hex$;TAB(30);bin$
- ENDIF
- ENDIF
- UNTIL key$=" " OR key$=CHR$(13)
- IF key$=CHR$(13)
- CLS
- ENDIF
- UNTIL key$=" "
- @all.midi.off
- REPEAT
- UNTIL INKEY$=""
- PRINT " (press any key)"
- ~INP(2)
- RETURN
- ' **********
- '
- ' ------------------------------------------------------------------------------
- ' *** MIDI control commands ***
- '
- ' *** all Procedures : channel 1-16, other parameters 0-127
- '
- > PROCEDURE note.off(channel,note,velocity)
- OUT 3,&H80+channel-1,note,velocity
- RETURN
- ' ***
- > PROCEDURE note.on(channel,note,velocity)
- ' *** note off : velocity=0
- OUT 3,&H90+channel-1,note,velocity
- RETURN
- ' ***
- > PROCEDURE key.pressure(channel,note,pressure)
- OUT 3,&HA0+channel-1,note,pressure
- RETURN
- ' ***
- > PROCEDURE control.change(channel,number,value)
- OUT 3,&HB0+channel-1,number,value
- RETURN
- ' ***
- > PROCEDURE program.change(channel,number)
- OUT 3,&HC0+channel-1,number
- RETURN
- ' ***
- > PROCEDURE channel.pressure(channel,pressure)
- OUT 3,&HD0+channel-1,pressure
- RETURN
- ' ***
- > PROCEDURE pitch.bend(channel,bend)
- ' *** bend 0-255
- LOCAL byte1|,byte2|
- IF BTST(bend,0)
- byte1|=64
- ELSE
- byte1|=0
- ENDIF
- byte2|=SHR|(BYTE(bend),1)
- OUT 3,&HE0+channel-1,byte1|,byte2|
- RETURN
- ' ------------------------------------------------------------------------------
- '
- ' ------------------------------------------------------------------------------
- ' *** specific MIDI control change events ***
- '
- > PROCEDURE modulate(channel,modulate)
- OUT 3,&HB0+channel-1,1,modulate
- RETURN
- ' ***
- > PROCEDURE data.entry(channel,data)
- OUT 3,&HB0+channel-1,6,data
- RETURN
- ' ***
- > PROCEDURE hold(channel,switch!)
- LOCAL hold|
- IF switch!
- hold|=127
- ELSE
- hold|=0
- ENDIF
- OUT 3,&HB0+channel-1,64,hold|
- RETURN
- ' ***
- > PROCEDURE all.notes.off(channel)
- OUT 3,&HB0+channel-1,123,0
- RETURN
- ' ***
- > PROCEDURE main.volume(channel,volume)
- OUT 3,&HB0,7,volume
- RETURN
- ' ***
- > PROCEDURE omni(channel,switch!)
- ' *** switch for Omni (if on, channel will be ignored)
- IF switch!
- OUT 3,&HB0+channel-1,124,0 ! on
- ELSE
- OUT 3,&HB0+channel-1,125,0 ! off
- ENDIF
- RETURN
- ' ------------------------------------------------------------------------------
- '
- > PROCEDURE kawai.k1.exclusive(channel,function,sub1,sub2,VAR data|())
- ' *** send system exclusive data to Kawai K1
- ' *** data in byte-array
- LOCAL last,i
- OUT 3,&HF0,&H40,channel-1,function,&H0,&H3,sub1,sub2
- last=DIM?(data|())-1
- FOR i=0 TO last
- OUT 3,data|(i)
- NEXT i
- OUT 3,&HF7
- RETURN
- ' **********
- '
-